{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Ensemble Retriever `Convex Combination(CC)` 추가\n",
    "\n",
    "[written by@teddynote](https://github.com/teddylee777/langchain-teddynote)\n",
    "\n",
    "- 참고글: [AutoRAG 가 게재한 알고리즘 방식의 차이 설명](https://velog.io/@autorag/%EB%9E%AD%EC%B2%B4%EC%9D%B8%EC%9D%98-Ensemble-Retriever-%EC%9D%B4%EA%B2%8C-%EB%8C%80%EC%B2%B4-%EB%AD%90%EC%A7%80)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "아래의 주석을 풀고 패키지를 업데이트 후 진행합니다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 업데이트 후 진행\n",
    "# !pip install -qU langchain-teddynote"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from dotenv import load_dotenv\n",
    "\n",
    "load_dotenv()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 실험을 위한 사전 셋업"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain.retrievers import EnsembleRetriever as OriginalEnsembleRetriever\n",
    "from langchain_text_splitters import RecursiveCharacterTextSplitter\n",
    "from langchain_community.document_loaders import PDFPlumberLoader\n",
    "from langchain_community.vectorstores import FAISS\n",
    "from langchain_openai import OpenAIEmbeddings\n",
    "from langchain_teddynote.retrievers import KiwiBM25Retriever\n",
    "\n",
    "# 문서 로드(Load Documents)\n",
    "loader = PDFPlumberLoader(\"data/디지털정부혁신 추진계획.pdf\")\n",
    "\n",
    "# 문서 분할(Split Documents): 테스트를 위하여 작은 Chunk Size로 설정\n",
    "text_splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=0)\n",
    "split_documents = loader.load_and_split(text_splitter)\n",
    "\n",
    "# 임베딩(Embedding) 생성\n",
    "embeddings = OpenAIEmbeddings(model=\"text-embedding-3-small\")\n",
    "\n",
    "# FaissRetriever 생성\n",
    "faiss = FAISS.from_documents(\n",
    "    documents=split_documents, embedding=embeddings\n",
    ").as_retriever(search_kwargs={\"k\": 5})\n",
    "\n",
    "# KiwiBM25Retriever 생성(한글 형태소 분석기 + BM25 알고리즘)\n",
    "bm25 = KiwiBM25Retriever.from_documents(documents=split_documents, embedding=embeddings)\n",
    "bm25.k = 5\n",
    "\n",
    "# LangChain 버전의 EnsembleRetriever\n",
    "original_ensemble_retriever = OriginalEnsembleRetriever(retrievers=[faiss, bm25])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "CC 방식과 RRF 방식의 EnsembleRetriever 생성"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain_teddynote.retrievers import (\n",
    "    EnsembleRetriever,\n",
    "    EnsembleMethod,\n",
    ")\n",
    "\n",
    "# RRF 방식의 EnsembleRetriever (기본값으로 RRF 가 설정되어 있음)\n",
    "rrf_ensemble_retriever = EnsembleRetriever(\n",
    "    retrievers=[faiss, bm25], method=EnsembleMethod.RRF\n",
    ")\n",
    "\n",
    "# CC 방식의 EnsembleRetriever\n",
    "cc_ensemble_retriever = EnsembleRetriever(\n",
    "    retrievers=[faiss, bm25], method=EnsembleMethod.CC  # method 지정: CC\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 검색 결과 비교"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "def pretty_print(query):\n",
    "    for i, (original_doc, cc_doc, rrf_doc) in enumerate(\n",
    "        zip(\n",
    "            original_ensemble_retriever.invoke(query),\n",
    "            cc_ensemble_retriever.invoke(query),\n",
    "            rrf_ensemble_retriever.invoke(query),\n",
    "        )\n",
    "    ):\n",
    "        print(f\"[{i}] [Original] Q: {query}\", end=\"\\n\\n\")\n",
    "        print(original_doc.page_content)\n",
    "        print(\"-\" * 100)\n",
    "        print(f\"[{i}] [RRF] Q: {query}\", end=\"\\n\\n\")\n",
    "        print(rrf_doc.page_content)\n",
    "        print(\"-\" * 100)\n",
    "        print(f\"[{i}] [CC] Q: {query}\", end=\"\\n\\n\")\n",
    "        print(cc_doc.page_content)\n",
    "        print(\"=\" * 100, end=\"\\n\\n\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 검색 결과에 `\"Original\"` 과 `\"RRF\"` 는 차이가 없어야 합니다. (LangChain 그대로 구현)\n",
    "- 검색 결과에 `\"CC\"` 는 `\"RRF\"` 와 차이가 있을 수 있습니다.\n",
    "\n",
    "`RRF` 와 `CC` 방식의 검색 결과 비교하여 문서에 적합한 방식을 차용하시길 바랍니다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0] [Original] Q: 디지털 트랜스포메이션이란 무엇인가요?\n",
      "\n",
      "참고 1 디지털 정부혁신 추진전략\n",
      "디지털로 여는 좋은 세상\n",
      "□ 비전\n",
      "※ 부제 : 대한민국이 먼저 갑니다.\n",
      "□ 추진원칙 △ 최종 이용자의 관점에서\n",
      "△ 공공서비스 수준 향상을 목표로\n",
      "----------------------------------------------------------------------------------------------------\n",
      "[0] [RRF] Q: 디지털 트랜스포메이션이란 무엇인가요?\n",
      "\n",
      "참고 1 디지털 정부혁신 추진전략\n",
      "디지털로 여는 좋은 세상\n",
      "□ 비전\n",
      "※ 부제 : 대한민국이 먼저 갑니다.\n",
      "□ 추진원칙 △ 최종 이용자의 관점에서\n",
      "△ 공공서비스 수준 향상을 목표로\n",
      "----------------------------------------------------------------------------------------------------\n",
      "[0] [CC] Q: 디지털 트랜스포메이션이란 무엇인가요?\n",
      "\n",
      "○ (시스템) 디지털 신기술의 적기 도입과 활용 곤란\n",
      "- 기존 복잡한 용역개발 방식은 혁신주기가 짧은 디지털 전환에 부적합\n",
      "====================================================================================================\n",
      "\n",
      "[1] [Original] Q: 디지털 트랜스포메이션이란 무엇인가요?\n",
      "\n",
      "○ (시스템) 디지털 신기술의 적기 도입과 활용 곤란\n",
      "- 기존 복잡한 용역개발 방식은 혁신주기가 짧은 디지털 전환에 부적합\n",
      "----------------------------------------------------------------------------------------------------\n",
      "[1] [RRF] Q: 디지털 트랜스포메이션이란 무엇인가요?\n",
      "\n",
      "○ (시스템) 디지털 신기술의 적기 도입과 활용 곤란\n",
      "- 기존 복잡한 용역개발 방식은 혁신주기가 짧은 디지털 전환에 부적합\n",
      "----------------------------------------------------------------------------------------------------\n",
      "[1] [CC] Q: 디지털 트랜스포메이션이란 무엇인가요?\n",
      "\n",
      "○ (디지털 고지‧수납) 각종 고지서·안내문* 등을 온라인(공공‧민간)\n",
      "으로 받고, 간편하게 납부할 수 있도록 디지털 고지‧수납 활성화\n",
      "====================================================================================================\n",
      "\n",
      "[2] [Original] Q: 디지털 트랜스포메이션이란 무엇인가요?\n",
      "\n",
      "Ⅰ. 개 요\n",
      "□ 추진 배경\n",
      "○ 우리나라는 국가적 초고속 정보통신망 투자와 적극적인 공공정보화\n",
      "사업 추진에 힘입어 세계 최고수준의 전자정부를 구축‧운영\n",
      "----------------------------------------------------------------------------------------------------\n",
      "[2] [RRF] Q: 디지털 트랜스포메이션이란 무엇인가요?\n",
      "\n",
      "Ⅰ. 개 요\n",
      "□ 추진 배경\n",
      "○ 우리나라는 국가적 초고속 정보통신망 투자와 적극적인 공공정보화\n",
      "사업 추진에 힘입어 세계 최고수준의 전자정부를 구축‧운영\n",
      "----------------------------------------------------------------------------------------------------\n",
      "[2] [CC] Q: 디지털 트랜스포메이션이란 무엇인가요?\n",
      "\n",
      "참고 1 디지털 정부혁신 추진전략\n",
      "디지털로 여는 좋은 세상\n",
      "□ 비전\n",
      "※ 부제 : 대한민국이 먼저 갑니다.\n",
      "□ 추진원칙 △ 최종 이용자의 관점에서\n",
      "△ 공공서비스 수준 향상을 목표로\n",
      "====================================================================================================\n",
      "\n",
      "[3] [Original] Q: 디지털 트랜스포메이션이란 무엇인가요?\n",
      "\n",
      "○ (디지털 고지‧수납) 각종 고지서·안내문* 등을 온라인(공공‧민간)\n",
      "으로 받고, 간편하게 납부할 수 있도록 디지털 고지‧수납 활성화\n",
      "----------------------------------------------------------------------------------------------------\n",
      "[3] [RRF] Q: 디지털 트랜스포메이션이란 무엇인가요?\n",
      "\n",
      "○ (디지털 고지‧수납) 각종 고지서·안내문* 등을 온라인(공공‧민간)\n",
      "으로 받고, 간편하게 납부할 수 있도록 디지털 고지‧수납 활성화\n",
      "----------------------------------------------------------------------------------------------------\n",
      "[3] [CC] Q: 디지털 트랜스포메이션이란 무엇인가요?\n",
      "\n",
      "○ 오픈소스 중심의 디지털정부 생태계와 공공시장 수요를 바탕으로\n",
      "첨단 디지털 산업의 혁신 가속화와 글로벌 도약을 위한 전기 마련\n",
      "====================================================================================================\n",
      "\n",
      "[4] [Original] Q: 디지털 트랜스포메이션이란 무엇인가요?\n",
      "\n",
      "보다 안정성‧편의성이 높은 스마트폰 기반 디지털 신분증 도입\n",
      "* 학생증, 공무원증 등 이용대상과 목적이 명확한 분야부터 안전성 점검 후 단계적 확대\n",
      "----------------------------------------------------------------------------------------------------\n",
      "[4] [RRF] Q: 디지털 트랜스포메이션이란 무엇인가요?\n",
      "\n",
      "보다 안정성‧편의성이 높은 스마트폰 기반 디지털 신분증 도입\n",
      "* 학생증, 공무원증 등 이용대상과 목적이 명확한 분야부터 안전성 점검 후 단계적 확대\n",
      "----------------------------------------------------------------------------------------------------\n",
      "[4] [CC] Q: 디지털 트랜스포메이션이란 무엇인가요?\n",
      "\n",
      "디지털 정부혁신 추진계획\n",
      "2019. 10. 29.\n",
      "관계부처 합동\n",
      "====================================================================================================\n",
      "\n",
      "[5] [Original] Q: 디지털 트랜스포메이션이란 무엇인가요?\n",
      "\n",
      "○ 오픈소스 중심의 디지털정부 생태계와 공공시장 수요를 바탕으로\n",
      "첨단 디지털 산업의 혁신 가속화와 글로벌 도약을 위한 전기 마련\n",
      "----------------------------------------------------------------------------------------------------\n",
      "[5] [RRF] Q: 디지털 트랜스포메이션이란 무엇인가요?\n",
      "\n",
      "○ 오픈소스 중심의 디지털정부 생태계와 공공시장 수요를 바탕으로\n",
      "첨단 디지털 산업의 혁신 가속화와 글로벌 도약을 위한 전기 마련\n",
      "----------------------------------------------------------------------------------------------------\n",
      "[5] [CC] Q: 디지털 트랜스포메이션이란 무엇인가요?\n",
      "\n",
      "Ⅰ. 개 요\n",
      "□ 추진 배경\n",
      "○ 우리나라는 국가적 초고속 정보통신망 투자와 적극적인 공공정보화\n",
      "사업 추진에 힘입어 세계 최고수준의 전자정부를 구축‧운영\n",
      "====================================================================================================\n",
      "\n",
      "[6] [Original] Q: 디지털 트랜스포메이션이란 무엇인가요?\n",
      "\n",
      "디지털기기 사용이 어려운 분들이 차별없이 서비스를 받도록 지원하겠습니다.\n",
      "권익위,\n",
      "□1 국민의 소리 청취·분석 시스템 개선 (22년)\n",
      "각부처·지자체\n",
      "----------------------------------------------------------------------------------------------------\n",
      "[6] [RRF] Q: 디지털 트랜스포메이션이란 무엇인가요?\n",
      "\n",
      "디지털기기 사용이 어려운 분들이 차별없이 서비스를 받도록 지원하겠습니다.\n",
      "권익위,\n",
      "□1 국민의 소리 청취·분석 시스템 개선 (22년)\n",
      "각부처·지자체\n",
      "----------------------------------------------------------------------------------------------------\n",
      "[6] [CC] Q: 디지털 트랜스포메이션이란 무엇인가요?\n",
      "\n",
      "보다 안정성‧편의성이 높은 스마트폰 기반 디지털 신분증 도입\n",
      "* 학생증, 공무원증 등 이용대상과 목적이 명확한 분야부터 안전성 점검 후 단계적 확대\n",
      "====================================================================================================\n",
      "\n",
      "[7] [Original] Q: 디지털 트랜스포메이션이란 무엇인가요?\n",
      "\n",
      "디지털 정부혁신 추진계획\n",
      "2019. 10. 29.\n",
      "관계부처 합동\n",
      "----------------------------------------------------------------------------------------------------\n",
      "[7] [RRF] Q: 디지털 트랜스포메이션이란 무엇인가요?\n",
      "\n",
      "디지털 정부혁신 추진계획\n",
      "2019. 10. 29.\n",
      "관계부처 합동\n",
      "----------------------------------------------------------------------------------------------------\n",
      "[7] [CC] Q: 디지털 트랜스포메이션이란 무엇인가요?\n",
      "\n",
      "디지털기기 사용이 어려운 분들이 차별없이 서비스를 받도록 지원하겠습니다.\n",
      "권익위,\n",
      "□1 국민의 소리 청취·분석 시스템 개선 (22년)\n",
      "각부처·지자체\n",
      "====================================================================================================\n",
      "\n",
      "[8] [Original] Q: 디지털 트랜스포메이션이란 무엇인가요?\n",
      "\n",
      "참고 3 디지털 정부혁신 기대효과\n",
      "◈ 동 방안을 성공적으로 추진하는 경우, 정부 디지털 서비스에서 세계 최고\n",
      "----------------------------------------------------------------------------------------------------\n",
      "[8] [RRF] Q: 디지털 트랜스포메이션이란 무엇인가요?\n",
      "\n",
      "참고 3 디지털 정부혁신 기대효과\n",
      "◈ 동 방안을 성공적으로 추진하는 경우, 정부 디지털 서비스에서 세계 최고\n",
      "----------------------------------------------------------------------------------------------------\n",
      "[8] [CC] Q: 디지털 트랜스포메이션이란 무엇인가요?\n",
      "\n",
      "참고 3 디지털 정부혁신 기대효과\n",
      "◈ 동 방안을 성공적으로 추진하는 경우, 정부 디지털 서비스에서 세계 최고\n",
      "====================================================================================================\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# 검색 결과 비교\n",
    "pretty_print(\"디지털 트랜스포메이션이란 무엇인가요?\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "py-test",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
